﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using University.Workshop.Model;

namespace University.Workshop.DataAccess
{
    public static class Generator
    {
        // generador de lecturas v2 powered by cruzbasco
        public static void GenerateWaterReadingsAndWaterCollectsForAllKardex()
        {
            // hacer todo mientras exista al menos un registro de tarifas base
            if (DataAccessFeesAndFines.ExistAnyFeesAndFinesRegistered())
            {
                // actual tarifario 
                FeesAndFines currentTax = (DataAccessFeesAndFines.GetCurrentFeesAndFines()).First();
                // fecha para el pasado mes
                DateTime oldDate = DateTime.Now;
                oldDate.AddMonths(-1);
                // obtener lista de todos los kardex habiles
                var kardexList = DataAccessKardex.GetActiveKardex();
                // iterar lista
                foreach (Kardex kardex in kardexList)
                {
                    // preguntar si existe un aporte del pasado mes
                    if (!DataAccessOtherCollectControl.ExistAnyOtherCollectWithThisKardexIDAndDate(kardex.KardexId, oldDate))
                    {
                        //si el aporte es igual a cero no hacerlo
                        if (currentTax.MonthlyContribution > 0)
                        {
                            // generar aporte del pasado mes
                            OtherCollectControl waterCollect = new OtherCollectControl()
                            {
                                KardexId = kardex.KardexId,
                                CollectType = (short)OtherChargeType.Aporte,
                                DateGenerated = oldDate,
                                IsPaid = false,
                                PaymentAmount = currentTax.MonthlyContribution
                            };
                            // guardar consumo
                            DataAccessOtherCollectControl.RegisterOtherCollectControl(waterCollect);
                        }
                    }
                    // si tienen medidor
                    if (kardex.HasAWaterMeasurer)
                    {
                        // preguntar si existe una lectura del pasado mes
                        if (DataAccessWaterReadingControl.ExistAnyWaterReadingWithThisKardexIDAndDate(kardex.KardexId, oldDate))
                        {
                            // salida rapida
                            break;
                        }
                        // obtener lectura valida
                        var listReadings = kardex.WaterReadingControls.Where(x => x.IsValidReading == true);
                        WaterReadingControl lastReading = listReadings.First();
                        // invalidar lectura previa
                        lastReading.IsValidReading = false;
                        DataAccessWaterReadingControl.UpdataWaterReadingControl(lastReading);
                        // generar lectura del pasado mes
                        WaterReadingControl waterReading = new WaterReadingControl()
                        {
                            KardexId = kardex.KardexId,
                            CurrentMeasurerRead = 0,
                            PreviousMeasurerRead = lastReading.CurrentMeasurerRead,
                            PaidAmount = 0,
                            ReadingDate = oldDate,
                            WaterFare = currentTax.Charge,
                            ReadingState = (short)ReadingState.Nuevo,
                            ReadingType = (short)ReadingType.Lectura,
                            IsValidReading = true
                        };
                        // guardar lectura
                        DataAccessWaterReadingControl.RegisterNewWaterReadingControl(waterReading);
                    }
                    // sino
                    else
                    {
                        // preguntar si existe un registro de consumo para el mes pasado
                        if (DataAccessWaterCollectControl.ExistAnyWaterCollectWithThisKardexIDAndDate(kardex.KardexId, oldDate))
                        {
                            // salida rapida
                            break;
                        }
                        // generar consumo minimo del pasado mes
                        WaterCollectControl waterCollect = new WaterCollectControl()
                        {
                            KardexId = kardex.KardexId,
                            CollectType = (short)Model.WaterChargeType.Consumo_Agua,
                            ReadingDate = oldDate,
                            DateGenerated = DateTime.Now.Date,
                            IsPaid = false,
                            PaymentAmount = currentTax.BaseRate
                        };
                        // guardar consumo
                        DataAccessWaterCollectControl.RegisterNewWaterCollectControl(waterCollect);
                    }
                }
            }
        }

        // generador de multas v2 powered by cruzbasco
        public static void GenerateFineForWaterCollects()
        {
            // hacer todo mientras exista al menos un registro de tarifas baseS
            if (DataAccessFeesAndFines.ExistAnyFeesAndFinesRegistered())
            {
                // actual tarifario 
                FeesAndFines currentTax = (DataAccessFeesAndFines.GetCurrentFeesAndFines()).First();
                // fecha para el pasado mes
                DateTime oldDate = DateTime.Now;
                oldDate.AddMonths(-1);
                // dia limite para pagar sin multa
                int? limitDay = DataAccessOtbData.GetCurrentOtbData().First().ExpirationDay;
                // obtener la lista de todos los consumos de agua del mes pasado que no fueron pagados
                var waterCollects = DataAccessWaterCollectControl.GetWaterCollects(oldDate);
                // iterar lista
                foreach (WaterCollectControl waterCollect in waterCollects)
                {
                    // preguntar si ya tiene una multa del mes pasado
                    if (DataAccessFineCollectControl.ExistAnyFineCollectWithThisKardexIDAndDate(waterCollect.KardexId, oldDate))
                    {
                        // salida rapida
                        break;
                    }
                    // preguntar ya es temprano para de cobrar la multa
                    if (oldDate.Day <= limitDay)
                    {
                        // salida rapida
                        break;
                    }
                    // generar multa
                    FineCollectControl fineCollect = new FineCollectControl()
                    {
                        CollectType = (short)FineType.Falta_Pago,
                        ControlDate = oldDate,
                        DateGenerated = DateTime.Now.Date,
                        IsPaid = false,
                        KardexId = waterCollect.KardexId,
                        PaymentAmount = currentTax.NonPayment

                    };
                    // guardar
                    DataAccessFineCollectControl.RegisterFineCollectControl(fineCollect);
                }
            }
        }
    }
}
